var numDecodings = function(s) {

    if (s[0] === '0') {
        return 0
    }
    let dp = []
    dp[0] = { value: 1, has: 0, base: 0 }
    for (let i = 1; i < s.length; i++) {
        let add = parseInt(s[i - 1] + s[i])
        if (s[i] === '0' && (s[i - 1] !== '1' && s[i - 1] !== '2')) {
            return 0
        }
        if (s[i] === '0' && i === 1 && add > 0 && add < 27) {
            dp[i] = { value: 1, has: 1, base: 0 }
            continue
        }

        if (s[i] === '*' || s[i - 1] === '*') {
            if (s[i] === '*') {
                if (s[i - 1] === '1') {
                    dp[i] = { value: dp[i - 1].value * 9 + (dp[i - 1].value - dp[i - 1].has) * 9, has: (dp[i - 1].value - dp[i - 1].has) * 9, base: 9 }
                } else if (s[i - 1] === '2') {
                    dp[i] = { value: dp[i - 1].value * 9 + (dp[i - 1].value - dp[i - 1].has) * 6, has: (dp[i - 1].value - dp[i - 1].has) * 6, base: 6 }
                } else {
                    dp[i] = { value: dp[i - 1].value * 9, has: 0, base: 0 }
                }
            } else {
                if (s[i] > 2)
                    dp[i] = { value: dp[i - 1].value * 9 + (dp[i - 1].value - dp[i - 1].has) * 9, has: (dp[i - 1].value - dp[i - 1].has) * 9 }
            }
        }

        if (s[i] === '0') {
            dp[i] = { value: dp[i - 2].value, has: 0 }
        } else {
            if (add > 0 && add < 27 && s[i - 1] !== '0') {
                dp[i] = { value: dp[i - 1].value * 2 - dp[i - 1].has, has: dp[i - 1].value - dp[i - 1].has }
            } else {
                dp[i] = { value: dp[i - 1].value, has: 0 }
            }
        }
    }
    return dp[dp.length - 1].value


    if (s[0] === '0') {
        return 0
    }
    let dp = []
    dp[0] = { value: 1, has: 0 }
    let add = false
    for (let i = 1; i < s.length; i++) {
        if (s[i] === '0' && s[i - 1] === '0') {
            return 0
        }
        add = false
        if (s[i] === '*' && (s[i - 1] === '1' || s[i - 1] === '2' || s[i - 1] === '*')) {
            add = true
        } else if (s[i - 1] === '*' && s[i] !== '0') {
            add = true
        } else if (parseInt(s[i - 1] + s[i]) > 0 && parseInt(s[i - 1] + s[i]) < 27) {
            add = true
        } else {
            add = false
        }
        if (s[i] === '0' && i === 1 && add) {
            dp[i] = { value: 1, has: 1 }
            continue
        }
        if (s[i] === '0') {
            if (add && s[i - 1] !== '0') {
                dp[i] = { value: dp[i - 2].value, has: 0 }
            } else {
                return 0
            }
        } else {
            if (add && s[i - 1] !== '0') {
                if (s[i] === '*' || s[i - 1] === '*') {
                    if (s[i] === '*' && s[i - 1] === '*') {
                        dp[i] = { value: dp[i - 1].value * 9 + -dp[i - 1].has, has: dp[i - 1].value - dp[i - 1].has }

                    } else if (s[i] === '*') {
                        if (s[i - 1] === '1') {
                            dp[i] = { value: dp[i - 1].value * 9 + (dp[i - 1].value - dp[i - 1].has) * 9, has: (dp[i - 1].value - dp[i - 1].has) * 9 }
                        } else if (s[i - 1] === '2') {
                            dp[i] = { value: dp[i - 1].value * 9 + (dp[i - 1].value - dp[i - 1].has) * 6, has: (dp[i - 1].value - dp[i - 1].has) * 6 }
                        } else {
                            dp[i] = { value: dp[i - 1].value * 9, has: 0 }
                        }
                    } else {
                        dp[i] = { value: dp[i - 1].value * 9 + (dp[i - 1].value - dp[i - 1].has) * 9, has: (dp[i - 1].value - dp[i - 1].has) * 9 }
                    }
                } else {
                    dp[i] = { value: dp[i - 1].value * 2 - dp[i - 1].has, has: dp[i - 1].value - dp[i - 1].has }
                }
            } else {
                dp[i] = { value: dp[i - 1].value, has: 0 }
            }
        }
    }
    return dp
};
console.log(numDecodings("1*"))